/* Copyright (c) 2011 Jordan Gray, MIT; see COPYRIGHT */


#ifndef LINT_REP_H_
#define LINT_REP_H_

#include <string>
#include "lint.h"

namespace ch11ex05 {

typedef std::list<unsigned char> ListUChar;

class LINT::LINTRep {
public:
  ~LINTRep();
  LINTRep() : digits_(ListUChar(1,0)), negative_(false) {}
  LINTRep(const ListUChar& digits, bool negative) : digits_(digits), negative_(negative)  {}
  LINTRep(const LINTRep& lint_rep) : digits_(lint_rep.digits_), negative_(lint_rep.negative_) {}
  void SignedAccumulate(const LINTRep&, bool);
  void SignedMultiply(const LINTRep&);
  void SignedDivide(const LINTRep&);
  std::string ToString(void);
  static bool IsEqual(const LINTRep&, const LINTRep&);
private:
  static bool IsEqualMagnitude(const LINTRep&, const LINTRep&);
  static bool IsEqualSign(const LINTRep&, const LINTRep&);
  static bool IsGreaterMagnitude(const LINTRep&, const LINTRep&);
  static bool IsZero(const LINTRep&);
  void UnsignedAdd(const LINTRep&);
  void UnsignedSubtract(const LINTRep&);
  void UnsignedMultiply(const LINTRep&);
  void UnsignedDivide(const LINTRep&);
  ListUChar digits_;
  bool negative_;
};

} // namespace ch11ex05
#endif /* LINT_REP_H_ */
